Cloudflare로 로컬서버 호스팅하기
맥 기준
목차
초기 설정
Cloudflare 계정 생성 ~ 도메인 구매
여기까지는 되어 있다고 가정
cloudflared
cloudflared: Cloudflare Tunnel 클라이언트 CLI
설치(homebrew 는 설치되어 있다고 가정)
brew install cloudflared
맥 외의 OS 는 여기서 확인
Cloudflare 로그인
cloudflared tunnel login
브라우저가 열리면서 Cloudflare 계정에 로그인 창이 뜨면 로그인
Tunnel 생성
cloudflared tunnel create <터널 이름>
# Tunnel credentials written to <루트 경로>/.cloudflared/<터널 ID>.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.\
#
# Created tunnel <터널 이름> with id <터널 ID>
plist 파일 생성
컴퓨터가 재부팅 되거나 프로세시가 종료됐을 때마다 자동으로 cloudflared tunnel run <터널 이름>
를 재실행하기 위한 plist 파일을 생성하는 과정.
매번 수동으로만 할거라면 필요 없음.(그게 더 안전하기도 하고)
상기했다시피 맥 기준이고 그 외의 OS 라면 시작 프로그램으로 cloudflared tunnel run <터널 이름>
커맨드가 실행되도록 설정하면 됨.
# 파일 이름은 좀 달라도 됨 중요한 것 아님
sudo touch ~/Library/LaunchAgent/com.user.cloudflared.plist
본인이 편한 IDE로 열어서 아래 내용을 붙여넣기
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key> <!-- 라벨 이름, 변경해도 됨 -->
<string>com.user.cloudflared</string>
<key>ProgramArguments</key> <!-- 실행할 커맨드 -->
<array>
<!--
cloudflared 경로
homebrew 로 설치한 거라 경로가 다를 수도 있음
확인은 `which cloudflared` 로 확인 가능
-->
<string>/opt/homebrew/bin/cloudflared</string>
<string>tunnel</string>
<string>run</string>
<!--
터널 이름은 위에서 생성한 터널 이름로 변경해야 함
-->
<string>터널 이름</string>
</array>
<key>RunAtLoad</key> <!-- 컴퓨터가 켜질 때 자동으로 실행 -->
<true/>
<key>KeepAlive</key> <!-- 프로세스가 죽었을 때 자동으로 재실행 -->
<true/>
<key>StandardOutPath</key> <!-- 로그 파일 경로 -->
<string>/tmp/cloudflared.log</string>
<key>StandardErrorPath</key> <!-- 에러 로그 파일 경로 -->
<string>/tmp/cloudflared.error.log</string>
</dict>
</plist>
plist
파일에 대한 것은 Apple 공식 문서를 참고.
공식 문서가 너무 길다면 요약본 참고.
새로운 도메인 추가 시
config.yml
파일 수정
# ~/.cloudflared/config.yml
tunnel: <터널 ID>
credentials-file: <터널 credentials 파일 경로>
ingress:
- hostname: <도메인1>
service: http://localhost:<포트1>
- hostname: <도메인2>
service: http://localhost:<포트2>
# ...
- service: http_status:404
CNAME 레코드 추가
cloudflared tunnel route dns <터널 이름> <도메인>
해당 커멘드를 입력하고 Cloudflare 대시보드에 접속하면 DNS 레코드가 추가되어 있음.
cloudflared 재시작
launchctl list | grep <라벨 이름> | awk '{print $1}' | xargs -n1 kill -15
커멘드 설명:
launchctl list
: 모든 launchd job을 출력grep <라벨 이름>
: 해당 문자열 포함 행만 필터링awk '{print $1}'
: 첫 번째 필드(PID)만 추출xargs -n1 kill -15
: 각 PID에 kill -15 실행
launchctl list
명령어는 등록된 모든 launchd job을 PID
, Status
, Label
순으로 출력함.
이 중 plist
파일의 라벨 이름을 포함하는 행을 grep
으로 찾아냄.
그 후 awk
로 첫 인자인 PID만 추출해서, xargs
를 통해 PID에 대해 kill -15
명령어로 프로세스를 종료함.
2025-07-08 수정 전
수정 이유: 해당 커멘드로는 아무리 해도 재시작이 안됨. 그래서 그냥 프로세스 종료 후 다시 시작하는 방법으로 변경함.
launchctl unload ~/Library/LaunchAgents/com.user.cloudflared.plist
launchctl load ~/Library/LaunchAgents/com.user.cloudflared.plist
일회성 연결
터널 생성 없이 Cloudflare Access 를 통해 로컬 서버에 접근하기
cloudflared access tcp --hostname <도메인> --url http://localhost:<포트>
이 커맨드는 터널을 생성하지 않고도 Cloudflare Access 를 통해 로컬 서버에 접근할 수 있도록 해줌.
tunnel 바로 실행
cloudflared tunnel run <터널 이름>
터미널에서 실행되고 있는 동안만 터널이 활성화됨.